package com.fish.web.pay.callback;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

import org.apache.commons.lang.xwork.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import com.alipay.util.AlipayNotify;
import com.fish.account.po.Recharges;
import com.fish.common.web.BaseAction;
import com.fish.service.account.AccountService;
import com.fish.service.account.RechargesService;

public class AlipayCallbackAction extends BaseAction {
	private static final long serialVersionUID = 2310278737601086881L;
	private static final Log loger = LogFactory.getLog(AlipayCallbackAction.class);
	private RechargesService rechargesService;
	private String outTradeNo;
	private String totalFee;
	
	/**
	 * 异步支付宝返回方法
	 * 
	 * @return
	 */
	public String ajaxCallback() {
		loger.info("支付宝异步返回信息");
		this.callback();
		return null;
	}
	
	/**
	 * 同步支付成功方法
	 * 
	 * @return
	 */
	public String callback() {
		loger.debug("支付宝同步返回信息");
		//获取支付宝POST过来反馈信息
		Map<String,String> params = new HashMap<String,String>();
		Map<?, ?> requestParams = this.getRequest().getParameterMap();
		for (Iterator<?> iter = requestParams.keySet().iterator(); iter.hasNext();) {
			String name = (String) iter.next();
			String[] values = (String[]) requestParams.get(name);
			String valueStr = "";
			for (int i = 0; i < values.length; i++) {
				valueStr = (i == values.length - 1) ? valueStr + values[i]
						: valueStr + values[i] + ",";
			}
			//乱码解决，这段代码在出现乱码时使用。如果mysign和sign不相等也可以使用这段代码转化
			//valueStr = new String(valueStr.getBytes("ISO-8859-1"), "gbk");
			params.put(name, valueStr);
		}
		
		//获取支付宝的通知返回参数，可参考技术文档中页面跳转同步通知参数列表(以下仅供参考)//
		//商户订单号

		String out_trade_no = this.getRequest().getParameter("out_trade_no");
		this.outTradeNo=out_trade_no;

		//支付宝交易号

		String trade_no = this.getRequest().getParameter("trade_no");
		String total_fee = this.getRequest().getParameter("total_fee");
		

		//交易状态
		String trade_status = this.getRequest().getParameter("trade_status");
		loger.info("商品订单号：out_trade_no"+out_trade_no+";交易流水号：trade_no"+trade_no+";交易状态：trade_status"+trade_status +";交易金额：total_fee" +total_fee);

		//获取支付宝的通知返回参数，可参考技术文档中页面跳转同步通知参数列表(以上仅供参考)//

		if(AlipayNotify.verify(params)){//验证成功
			//////////////////////////////////////////////////////////////////////////////////////////
			//请在这里加上商户的业务逻辑程序代码

			//——请根据您的业务逻辑来编写程序（以下代码仅作参考）——
			
			if(trade_status.equals("TRADE_FINISHED")){
				//判断该笔订单是否在商户网站中已经做过处理
					//如果没有做过处理，根据订单号（out_trade_no）在商户网站的订单系统中查到该笔订单的详细，并执行商户的业务程序
					//如果有做过处理，不执行商户的业务程序
					
				//注意：
				//该种交易状态只在两种情况下出现
				//1、开通了普通即时到账，买家付款成功后。
				//2、开通了高级即时到账，从该笔交易成功时间算起，过了签约时的可退款时限（如：三个月以内可退款、一年以内可退款等）后。
				Recharges recharges = new Recharges();
				recharges.setStatus("充值失败！");
				recharges.setTradeNo(out_trade_no);
				rechargesService.updateRecharges(recharges);
			} else if (trade_status.equals("TRADE_SUCCESS")){
				//判断该笔订单是否在商户网站中已经做过处理
				//如果没有做过处理，根据订单号（out_trade_no）在商户网站的订单系统中查到该笔订单的详细，并执行商户的业务程序
				//如果有做过处理，不执行商户的业务程序
				
				//注意：
				//该种交易状态只在一种情况下出现——开通了高级即时到账，买家付款成功后。
				paySuccessCallBack(out_trade_no,total_fee);
			}

		}else{
			//验证失败
			return ERROR;
		}
		
		return SUCCESS;
	}

	/**
	 * 支付成功调用的方法
	 * 
	 * @param out_trade_no
	 */
	private void paySuccessCallBack(String out_trade_no,String total_fee) {
		Recharges recharges = new Recharges();
		recharges.setStatus("充值成功");
		recharges.setTradeNo(out_trade_no);
		recharges.setUserId(getSessionUser().getUserId());
		recharges.setTotalFee(total_fee);
		rechargesService.updateRecharges(recharges);
	}
	
	public String createPaySuccess() {
		if(StringUtils.isNotEmpty(outTradeNo)&&StringUtils.isNotEmpty(totalFee)) {
			this.paySuccessCallBack(outTradeNo, totalFee);
		}
		return SUCCESS;
	}

	public void setRechargesService(RechargesService rechargesService) {
		this.rechargesService = rechargesService;
	}

	public String getOutTradeNo() {
		return outTradeNo;
	}

	public void setOutTradeNo(String outTradeNo) {
		this.outTradeNo = outTradeNo;
	}

	public String getTotalFee() {
		return totalFee;
	}

	public void setTotalFee(String totalFee) {
		this.totalFee = totalFee;
	}

}